package ft.esc.impl.trav;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import ft.esc.itf.IStringCallBack;

public abstract class DirFileTravBase
{
	/**
	 * 业务逻辑，调用该方法前必须先设置 {@link #addFaLst(String)} 以确定要遍历的文件或目录。
	 */
	public abstract void startRun();
	
	/**
	 * 外部似乎不需要该 get 方法……
	 * @return
	 */
	protected List<String> getFaLst()
	{
		enSureFaLst();
		return _faLst;
	}
	
	/**
	 * 向 faLst 中增加一行，可以是文件，也可以是目录。<br />
	 * 必须保证该 list 不为空的前提下，才可以执行具体的业务逻辑。
	 * @param str
	 */
	public void addFaLst(String str)
	{
		if(str!=null && str.length()>0)
		{
			enSureFaLst();
			_faLst.add(str);
		}
	}
	
	/**
	 * 向 faLst 增加多行，可以是文件，也可以是目录。<br />
	 * 必须保证该 list 不为空的前提下，才可以执行具体的业务逻辑。
	 * @param lst
	 */
	public void addFaLst(List<String> lst)
	{
		if(lst!=null && lst.size()>0)
		{
			enSureFaLst();
			for(int i=0; i<lst.size(); i++)
			{
				_faLst.add(lst.get(i));
			}
		}
	}
	
	/**
	 * 确保 faLst 不为 null 空
	 */
	private void enSureFaLst()
	{
		if(null==_faLst)
		{
			_faLst = new ArrayList<String>();
		}
	}
	
	private List<String> _faLst = null; // new ArrayList<String>();

	/**
	 * 判断是否为文件，且是否存在，且是否可读
	 * @param filePath
	 * @return
	 */
	public static boolean isFile(String filePath)
	{
		boolean ret = false;
		
		if(filePath!=null && filePath.length()>0)
		{
			File f = new File(filePath);
			if(f!=null)
			{
				ret = f.exists() && f.canRead() && f.isFile();
			}
		}
		
		return ret;
	}
	
	/**
	 * 判断是否为目录
	 * @param filePath
	 * @return
	 */
	public static boolean isDir(String filePath)
	{
		boolean ret = false;
		
		if(filePath!=null && filePath.length()>0)
		{
			File f = new File(filePath);
			if(f!=null)
			{
				ret = f.exists() && f.isDirectory();
			}
		}
		
		return ret;
	}
	
	/**
	 * 返回一个排序倒序的新数组。
	 * @param ary
	 * @return
	 */
	public static String[] getInvertSortArray(String[] ary)
	{
		String[] ret = null;
		
		if(ary!=null && ary.length>0)
		{
			List<String> lst = new ArrayList<String>( ary.length );
			for(int i=0; i<ary.length; i++)
			{
				// 这里需要考虑去重么？
				lst.add(ary[i]);
			}
			
			if(lst!=null && lst.size()>0)
			{
				lst.sort(null);
				
				// 排序后倒序输出数组
				ret = new String[lst.size()];
				for(int i=0; i<lst.size(); i++)
				{
					ret[i] = lst.get(lst.size()-1-i);
				}
			}
		}
		return ret;
	}
	
	private IStringCallBack _cb = null;
	
	public void setCallBack(IStringCallBack cb)
	{
		if(cb!=null)
		{
			_cb = cb;
		}
	}
	
//	protected IStringCallBack getCb()
//	{
//		return _cb;
//	}
	
	/**
	 * 遍历过程中在合适的场合调用回调函数。
	 * @param str
	 */
	protected void execStringCallBack(String str)
	{
		if(_cb!=null)
		{
			if(str!=null && str.length()>0)
			{
				_cb.processData(str);
			}
			else
			{
				System.out.println("DirFileTrav 执行回调函数，传入参数 str 为 null 空或者长度为零，无法执行。");
			}
		}
		else
		{
			System.out.println("DirFileTrav 回调函数为 null 空，无法执行回调。");
		}
	}
}
